﻿using ExcellentProjectPlus.Dominio.Calificaciones.Servicios.Cursos;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Calificaciones.Cursos
{
    public class ServicoDeGestionDeCursos : IServicioDeGestionDeCursos
    {
        #region Propiedades
        IServicioDeAdministracionDeCursos _servicioDeAdministracionDeCursos;        
        #endregion

        #region Constructores
        public ServicoDeGestionDeCursos(IServicioDeAdministracionDeCursos servicioDeAdministracionDeCursos)
        {
            _servicioDeAdministracionDeCursos = servicioDeAdministracionDeCursos;
        }
        #endregion

        public IEnumerable<Curso> ObtenerCursos()
        {
            IEnumerable<Curso> resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCursos.ObtenerCursos();
                transaccion.Complete();
            }

            return resultado;
        }

        public Curso ObtenerCursoPorId(int id)
        {
            Curso resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCursos.ObtenerCursos().Where(c => c.Id == id).FirstOrDefault();
                transaccion.Complete();
            }
            return resultado;
        }

        public void AgregarCurso(Curso curso)
        {
            _servicioDeAdministracionDeCursos.AgregarCurso(curso);
        }
        public void ModificarCurso(Curso curso)
        {
            _servicioDeAdministracionDeCursos.ModificarCurso(curso);
        }
        public void EliminarCurso(Curso curso)
        {
            _servicioDeAdministracionDeCursos.EliminarCurso(curso);
        }

        public IEnumerable<Curso> ObtenerCursosPaginado(int pagina, int tamanio)
        {
            return _servicioDeAdministracionDeCursos.ObtenerCursosPaginado(pagina, tamanio);
        }



        public IEnumerable<InformacionCurso> ObtenerInformacionCursos()
        {
            return _servicioDeAdministracionDeCursos.ObtenerInformacionCursos();
        }


        public List<Curso> ObtenerCursosPorDocente(int idDocente)
        {
            return _servicioDeAdministracionDeCursos.ObtenerCursosPorDocente(idDocente);
        }
    }
}
